package version2024.medium;

import java.util.Scanner;

/**
 * @author sunhl
 * @Description: HJ107 求解立方根  二分查找
 * @Date: created in 2025/1/9 星期四 17:45
 * @Modified By:
 */
public class HJ107_SolveCubeRoot {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            double input = in.nextDouble();

            //负数 当正数来处理
            double num = input > 0 ? input : -input;

            double bottom = 0;
            double top = 0;
            // 比如 5 介于 1^3  和 2^3之间
            while (top * top * top < num) {
                top++;
            }
            // num的立方根在top和bottom之间
            bottom = top - 1;

            // 计算第一遍中位数和立方值
            double mid = bottom + (top - bottom) / 2;
            double mul = mid * mid * mid;

            // 因为只保留一位小数, 利用循环将top和bottom的差要缩小到0.1以内
            while (top - bottom > 0.1) {
                // 如果立方值比输入值大, 将top缩小到中位数, 反之将bottom上升到中位数
                if (mul > num) {
                    top = mid;
                } else if (mul < num) {
                    bottom = mid;
                }

                // 重新计算中位数和立方值, 进入下一迭代
                mid = bottom + (top - bottom) / 2;
                mul = mid * mid * mid;
            }

            // 原数为负,结果也应该为负
            if (input < 0) {
                mid = -mid;
            }

            //  12  => 2.3      -5 ==> -1.7
            System.out.println(String.format("%.1f", mid));
        }
    }
}
